package cn.line5.seam.db;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import cn.line5.seam.exception.DBException;

/**
 * <h1>查询接口类</h1>
 * 
 * @author Liu,Xiaojun
 * @since JDK1.6
 */
public interface Query {
	/**
	 * 设置参数
	 * 
	 * @param position
	 *            参数标识
	 * @param val
	 *            参数
	 * @param type
	 *            参数类型
	 */
	public Query setParameter(Integer position, Object val, ParameterType type);

	/**
	 * 设置参数
	 * 
	 * @param position
	 *            参数标识
	 * @param val
	 *            参数
	 */
	public Query setParameter(Integer position, Object val);

	/**
	 * 执行查询单条数据
	 * 
	 * @return 装载数据的Map对象
	 * @throws DBException
	 *             SQL查询异常或不是被查询器执行
	 */
	public Map<String, Object> single() throws DBException;

	/**
	 * 执行查询单条数据
	 * 
	 * @param <T>
	 *            装载数据类泛型
	 * @param clazz
	 *            数据类（VO）的class
	 * @return 装载传入数据类（VO）的数据
	 * @throws DBException
	 *             SQL查询异常或不是被查询器执行
	 */
	public <T> T single(Class<T> clazz) throws DBException;

	/**
	 * 执行查询
	 * 
	 * @return 装载Map的数据列表
	 * @throws DBException
	 *             SQL查询异常或不是被查询器执行
	 */
	public List<Map<String, Object>> list() throws DBException;

	/**
	 * 执行查询
	 * 
	 * @param <T>
	 *            装载数据类泛型
	 * @param clazz
	 *            数据类（VO）的class
	 * @return 装载传入数据类（VO）的数据列表
	 * @throws DBException
	 *             SQL查询异常或不是被查询器执行
	 */
	public <T> List<T> list(Class<T> clazz) throws DBException;

	/**
	 * 执行操作
	 * 
	 * @return 受影响的行数
	 * @throws DBException
	 *             SQL执行异常或不是被执行器执行
	 */
	public int execute() throws DBException;

	/**
	 * 查询记录数，执行含有count()的SQL
	 * 
	 * @return 记录数
	 * @throws DBException
	 *             SQL查询异常
	 */
	public Integer count() throws DBException;

	/**
	 * 执行分页查询
	 * 
	 * @param <T>
	 *            装载数据类泛型
	 * @param clazz
	 *            数据类（VO）的class
	 * @return 装载传入数据类（VO）的分页数据对象
	 * @throws DBException
	 *             SQL查询异常
	 */
	public <T> PageResult<T> pageList(Class<T> clazz) throws DBException;

	/**
	 * 执行分页查询
	 * 
	 * @return 装载数据的Map对象列表
	 * @throws DBException
	 *             SQL查询异常
	 */
	public PageResult<Map<String, Object>> pageList() throws DBException;

	/**
	 * 设置字符串参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setString(int position, String val);

	/**
	 * 设置布尔参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setBoolean(int position, Boolean val);

	/**
	 * 设置字节参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setByte(int position, Byte val);

	/**
	 * 设置短型参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setShort(int position, Short val);

	/**
	 * 设置整型参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setInteger(int position, Integer val);

	/**
	 * 设置长型参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setLong(int position, Long val);

	/**
	 * 设置浮点型参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setFloat(int position, Float val);

	/**
	 * 设置双精度参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setDouble(int position, Double val);

	/**
	 * 设置java.math.BigDecimal型参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setBigDecimal(int position, BigDecimal val);

	/**
	 * 设置日期型参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setDate(int position, Date val);

	/**
	 * 设置时间参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setTime(int position, Date val);

	/**
	 * 设置日期时间参数
	 * 
	 * @param position
	 *            位置
	 * @param val
	 *            参数
	 * @return 查询接口
	 */
	public Query setTimestamp(int position, Date val);

	/**
	 * 设置每页行数
	 * 
	 * @param pageRows
	 *            每页行数
	 */
	public Query setPageRows(Integer pageRows);

	/**
	 * 设置当前页
	 * 
	 * @param currentPage
	 *            当前页
	 */
	public Query setCurrentPage(Integer currentPage);
}